/*
 * 
 */
package co.edu.udistrital.erpgrid.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import co.edu.udistrital.erpgrid.jaio.commons.JaioObjectVO;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
import com.thoughtworks.xstream.io.xml.DomDriver;

/**
 * La Clase XmlUtil - presenta funcionalidades de conversion bean a xml y viceversa.
 */
public class XmlUtil {
	
	
	
	public XmlUtil() {
		super();
	}

	/** La Constante LOG. */
	private static final Logger LOG = LoggerFactory
			.getLogger(XmlUtil.class);

	/** El xstream. para uso de las librerias */
	private static XStream xstream;

	static {
		xstream = new XStream(new DomDriver());
		xstream.autodetectAnnotations(true);
		xstream.processAnnotations(JaioObjectVO.class);
	}

	/**
	 * Convierte el objeto entregado a formato xml.
	 *
	 * @param obj el objeto a convertir
	 * @return el string del xml generado
	 */
	public static String toXml(Object obj) {
		String xml = xstream.toXML(obj);
//		String xml = new Gson().toJson(obj, obj.getClass());
		xml = formatXml(xml);
		return xml;
	}

	/**
	 * Convierte el xml en un Objeto de tipo JaioObjectVO
	 *
	 * @param xml el xml a convertir
	 * @return objeto con los parametros establecidos
	 */
	public static Object fromXml(String xml) {
		xml = formatXml(xml);
		return xstream.fromXML(xml, new JaioObjectVO());
//		return new Gson().fromJson(xml, JaioObjectVO.class);
	}

	/**
	 * Convierte el string xml en el objeto entregado
	 *
	 * @param xml el xml a convertir
	 * @param objectVO el objeto para establecer
	 * @return el objeto establecido.
	 */
	public static Object fromXml(String xml, JaioObjectVO objectVO) {
		xml = formatXml(xml);
//		return new Gson().fromJson(xml, JaioObjectVO.class);
		return xstream.fromXML(xml, objectVO);
	}

	/**
	 * Realizar operaciones de formato al string xml.
	 *
	 * @param xml the xml
	 * @return el string
	 */
	private static String formatXml(String xml) {
//		xml = xml.replaceAll("\"", "'");
//		xml = xml.replaceAll(":}", ":''}");
//		xml = xml.replaceAll(",]", ",{}]");
//		xml = xml.replaceAll(":,", ":null,");
		xml = xml.replaceAll(">\n", ">");
		while(xml.indexOf("> ")!=-1){
			xml = xml.replaceAll("> ", ">");
		}
		
		
		return xml;
	}
}
